package com.tedu.api.list;

import org.directwebremoting.json.JsonUtil;
import org.junit.jupiter.api.Test;

import java.util.*;

/**
 * Collection顶级集合容器
 * List集合【接口】继承于Collection【接口】
 * List集合：存储重复并且有序的元素
 * 注意：List集合类似数组，有些方法与数组一致
 * List集合【接口】
 * java.util.ArrayList
 * java.util.LinkList
 * 以上两个类使用方法完全一致
 *
 */
public class ListAPI {
    /**List接口--提供get方法，可以被ArrayList类重写
     * get(int index)   返回值：E
     *
     */
    @Test
    public void testGet() {
        //多态方式：父类引用指向子类对象 【常用：调父 子方法,方法相同：重写】
        //重写调用子类方法：如果子类没有重写，调用父类的方法
        //List<String> list=new ArrayList<>();
        //list.get(0);
        //直接创建实现类对象:调用ArrayList方法
        //ArrayList<String> al=new ArrayList<>();
        //al.get(0);
        List<String> list = new ArrayList<>();
        list.add("西游记");
        list.add("西厢记");
        list.add("西湖游记");
        list.add("西山行记");
        System.out.println("打印List集合：" + list);
        //获取下标：1
        String index = list.get(0);
        System.out.println("取出集合元素" + index);
        //遍历集合内容 --- 普通for
        int i;
        for (i=0;i<list.size();i++) ;
        //index =list.get(i);
        System.out.println("获取集合元素" + index);
    }
    /**List接口下方法
     * 添加 替换 移除
     * add(int index ,E e)方法   返回值：void   重载方法
     * 作用：将给定元素插入到指定位置
     * set(int index,E e)方法   返回值  E
     * 作用：将给定元素设置到指定的位置上【替换】
     * remove(int index )方法    返回值：E
     * Collection接口remove使用方法一致 用元素删除
     * List接口remove方法，用下标删除
     * -----------总结：以上三个方法都可以直接操作集合
     */
    @Test
    public void testASR() {
        List<String> list = new ArrayList<>();
        list.add("日");
        list.add("月");
        list.add("星");
        list.add("寰");
        //需求：在集合  two元素前 添加”2"
        list.add(2, "2");
        System.out.println("插入元素的集合" + list);
        //需求：在集合2  元素  将2  元素替换成二
        list.set(1,"2");
        System.out.println("修改元素的集合："+list);
        //需求：删除集合中”二“的元素
        list.remove("2");//Collection接口remove，通过元素删元素
        list.remove(1);//List接口remove，通过下标山元素
        System.out.println("删除元素的集合"+list);
    }
    /**List 提供可以获取自己的方法  返回值E{Object对象}
     * subList(int,start,int end)   口诀：含头不含尾巴
     * 作用：截取集合中范围内的子集
     */
    @Test
    public void test(){
        //创建集合， 指定类型Integer
        List<Integer> list=new ArrayList<>();
        //需求 添加个元素，元素数，0-9的数值
        for (int i=0;i<10;i++)
            list.add(i);//add()添加--重写：Collection-add的方发
        //打印集合
        System.out.println("增加元素后集合："+list);
        //需求：需要获取子集，范围：3-8的元素，分页操作：获取子集合
        List<Integer> list1=list.subList(3,9);
        //打印子集合
        System.out.println("获取子集"+list1);
        System.out.println("打印集合"+list);
        //练习：截取list 2-7的元素，子集扩大10倍，提醒，set方法
        List<Integer> list2=list.subList(2,8);
        for(int i=0;i<list2.size();i++){
            //设置子集扩大10倍
            list2.set(i, list2.get(i)*10);
            //set(i: 0~4  下标
            //    list2.get(0-4):获取对应元素*10)
        }
        System.out.println("输出list2子集集合："+list2);
        //练习2：删除list集合元素中：1-7的元素，提醒:子集，清楚
        List<Integer> listRem=list.subList(1,8);
        listRem.clear();
        System.out.println("删除list[2~7]元素，最终集合"+list);
        //总结：获取子集，打印子集没有操作，
        // 清空子集：原来集合移除一部分子集
    }
    /**
     * 数组转集合操作
     * Arrays工具类：提供静态方法 asList(数组引用)
     *              asList(数组引用):将数组转换为集合
     * 注意：
     */
    @Test
    public void testArrays(){
        //创建字符串静态数组
        String[] array={"十一","元旦","寒假"};
        //将数组转换为集合      ----软件更新
        List<String> list=Arrays.asList(array);
        //需求：将List集合中”元旦“改成”除夕“
        list.set(1,"除夕"); //set方法是List接口  方法
        System.out.println("数组转集合："+list);
        //需求：增强for，数组添加元素【add方法  add（”节日“）】
    }
    /**
     * List构造器使用；传有参
     * 创建集合：List
     */
    /**
     * 集合排序 Collection 工具类
     * 静态方法：
     * java.util.Random 伪随机类
     * 导入包问题：通用导入包方式   通配符* 匹配所用
     *           如果存在与util工具包下，如：import java.util.*
     *           类最上方： import java.util.Random
     *                     import java.util.List
     *                     import java.util.ArrayList
     *    需求：创建集合随机生成10个元素【100以内伪随机数】
     */
    @Test
    public void testRandom(){
        List<Integer> list=new ArrayList<>();
        //创建随机数对象
        Random random=new Random();
        //给list集合添加10个元素【100以内随机数】
        for(int i=0;i<10;i++){
            list.add(random.nextInt(100));
        }
        System.out.println("list集合："+list);
        //将list集合元素进行排序
        Collections.sort(list);
        System.out.println("排序后list集合"+list);
    }
    /**
     * 集合排序
     * Collection工具类
     *     Collection所有集合顶级接口，约定所有集合公有方法
     *     提供集合操作方法
     * 静态方法sort 功能：按照比较器约定规则排序
     * Comparator  比较器
     * 需求：集合存汉字---按照要求排序【比较器】
     */
    @Test
    public void testSort(){
        List<String> list=new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        Collections.sort(list);
        System.out.println("排序后集合"+list);
        //需求：按诈骗文字长短进行排序  重载sort方法
        //创建比较器接口对象  【匿名内部类】
        //创建比较器接口对象  约定一次排序效果
        //
        Comparator<String> com=new Comparator<String>() {
            //定义比较器规则：按照汉字长度排序---交换操作compare方法完成
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
                /**
                 *     o1.length() 获取第一个字符串长度
                 *     o2.length() 获取第二个字符串长度
                 * 汉字短移动靠前
                 * 返回值： 大于0   假设：4-2  交换
                 *         小于0   假设：3-2  不交换
                 *         等于0    假设：2-2  不变
                 */
            }
        };
        //Collection.sort(list,com);
        System.out.println("555:"+list);
    }

    /**
     * 总结：List集合
     * List接口集合    是Collection容器接口的子接口
     * List子接口  无法实例化  实现类：Arraylist，Linkedlist
     * 使用  保存一组数据  用List集合
     * list子接口就是Arraylist方法
     */
    @Test
    public void testArrayList(){
        List<String> list=new ArrayList<>();
        list.add("张三");list.add(0,"55");
        //由list
        //调取几个方法
        //list.add("张三");list.set(0,"55");
        //创建对象，只调ArrayList
        //ArrayList<String> arrayList=new ArrayList<>();
        //arrayList.add("44");
        //arrayList.set(0,"44");

    }
}
